#ifndef _XOS_INIT_H_
#define _XOS_INIT_H_

#define __used __attribute__((__used__))

typedef void (*initcall_t)(void);

#define __define_initcall(fn, id)                      \
    static const initcall_t __initcall_##fn##id __used \
        __attribute__((__section__("initcall" #id "init"))) = fn;

#define pure_initcall(fn)   __define_initcall(fn, 0)   // 可用作时钟初始化
#define core_initcall(fn)   __define_initcall(fn, 1)   // tick和调试接口初始化
#define device_initcall(fn) __define_initcall(fn, 2)   // 外设初始化
#define late_initcall(fn)   __define_initcall(fn, 3)   // 应用初始化

/**
 * @brief 对应 pure_initcall core_initcall device_initcall
 *
 */
void do_init_call(void);

/**
 * @brief 对应 late_initcall
 *
 */
void do_app_init_call(void);

#endif
